Primeiros Passos com ggplot2

Lineu Alberto Cavazani de Freitas


1 Visualização de Dados

Parte primordial de qualquer análise estatística é chamada análise descritiva ou exploratória. Tal etapa consiste basicamente de resumos numéricos e análises gráficas baseadas em conjuntos de dados.

Trata-se de uma etapa de extrema importância e deve preceder qualquer análise mais sofisticada como ajuste de modelos de regressão, por exemplo. Além disso, a análise exploratória não requer elevada proficiência em tópicos de estatística avançada para para aplicação e interpretação dos resultados fazendo com que visualização de dados caracteriza uma técnica simples, com grande apelo visual e extremamente informativa quanto ao conjunto de dados.

No R há a possibilidade de gerar gráficos sem a utilização de pacotes e há também pacotes específicos e especializados em visualização, dentre os quais destacam-se os famosos lattice e ggplot2.

Este post tem como foco explorar as principais e mais simples formas de visualização de dados utilizando o ggplot2 bem como algumas customizações simples como alteração de cores, temas, etc.


2 ggplot2

O ggplot2 é um pacote para geração de gráficos baseado no livro ‘The Grammar of Graphics’. Nele, o usuário fornece os dados, especifica como mapear as variáveis e que tipo de visualização usar, após isso basta customizar cores, formas e tamanho dos atributos.

Para instalação do pacote basta utilizar a função install.packages.

install.packages('ggplot2')

2.1 Função ggplot()

A principal função do pacote é a ggplot(). Esta função cria um objeto ggplot no qual devem ser declarados os dados e especificar o conjunto de características que vão compor o gráfico.

Leia a documentação da função com o comando:

?ggplot()

O primeiro passo para abrir uma janela gráfica no ggplot2 é especificar o data frame no argumento data e, dentro do aes() informar qual variável ficará no eixo x e qual ficará no eixo y. Além disso pode-se acrescentar outras variáveis ao aes() que serão representadas por cores, formas ou tamanhos diferentes.

ggplot(data = NULL, mapping = aes())

Apenas o comando acima abre uma janela em branco, para acrescentar pontos, linhas e formas ao gráfico são utilizados os ‘geoms’ do ggplot. Os geoms disponíveis do pacote são:

##  [1] "geom_abline"     "geom_area"       "geom_bar"       
##  [4] "geom_bin2d"      "geom_blank"      "geom_boxplot"   
##  [7] "geom_col"        "geom_contour"    "geom_count"     
## [10] "geom_crossbar"   "geom_curve"      "geom_density"   
## [13] "geom_density_2d" "geom_density2d"  "geom_dotplot"   
## [16] "geom_errorbar"   "geom_errorbarh"  "geom_freqpoly"  
## [19] "geom_hex"        "geom_histogram"  "geom_hline"     
## [22] "geom_jitter"     "geom_label"      "geom_line"      
## [25] "geom_linerange"  "geom_map"        "geom_path"      
## [28] "geom_point"      "geom_pointrange" "geom_polygon"   
## [31] "geom_qq"         "geom_qq_line"    "geom_quantile"  
## [34] "geom_raster"     "geom_rect"       "geom_ribbon"    
## [37] "geom_rug"        "geom_segment"    "geom_sf"        
## [40] "geom_smooth"     "geom_spoke"      "geom_step"      
## [43] "geom_text"       "geom_tile"       "geom_violin"    
## [46] "geom_vline"

A sintaxe para geração de um gráfico de dispersão simples é:

ggplot(data = dados,           # conjunto de dados
       mapping = aes(x = x,    # variável x
                     y = y)) + # variável y
  geom_point()                 # especifica que x e y serão representados como pares ordenados 

Pode-se acrescentar mais de um geom ao mesmo gráfico apenas com o acréscimo do sinal de mais (+).

Para verificar os tipos de gráficos mais comuns em análise exploratória e como customizar gráficos com o ggplot2, vamos analisar um conjunto de dados simulados.


3 Gerando um conjunto de dados

Vamos gerar e analisar um conjunto de dados tradicional composto por duas variáveis numéricas e uma variável categórica:

# gerando dois vetores 
v1 = rnorm(1500, 20, 5)
v2 = rnorm(1500, 20, 5 )

x = v1*2
y = v1+v2

z = rep(c('a','b'), 750)

df <- data.frame(x=x,y=y,z=z)

head(df)
##          x        y z
## 1 31.61067 35.11138 a
## 2 46.96268 43.00292 b
## 3 44.18966 42.14678 a
## 4 33.99729 23.37712 b
## 5 46.76924 50.93995 a
## 6 27.92536 37.30418 b

3.1 Análise com o R base

Uma análise básica do conjunto de dados gerado utilizando as funções base do R:

par(mfrow = c(1,3), par(oma=c(0,3,3,0)))
hist(df$y,probability = T, main = 'Histograma',col=3)
box()
lines(density(df$y), lwd=3, col=4)
plot(y~z, df, col = c(3,4), main='Boxplot')
mtext("Gráficos Base", side=3, line=3, cex=1 )
plot(y~x,df, col=c(3,4), main='Gráfico de Dispersão')
abline(lm(y~x, df), lwd=3)


4 Análise com ggplot2

Como o ggplot2 é um pacote, é necessário carregá-lo:

library(ggplot2)

4.1 Densidade

Um gráfico de densidade simples pode ser feito com os seguintes comandos:

ggplot(data=df, mapping = aes(x=y))+
  geom_density()

Dentro de um geom é possível acrescentar elementos extra para customização dos gráficos, por exemplo: o argumento col altera a cor do contorno, o argumento fill altera a cor de preenchimento e o alpha controla o aspecto de transparência do gráfico. Pode-se também acrescentar um geom_rug():

ggplot(data=df, mapping = aes(x=y)) +
  geom_density(col=4,
               fill='#088A85',
               alpha=0.3) + 
  geom_rug()


4.2 Histograma

Para gerar um histograma, basta acrescentar à função ggplot um geom_histogram():

ggplot(data=df, mapping = aes(x=x)) + 
  geom_histogram()

E pode-se incluir as mesmas customizações utilizadas no gráfico de densidade:

ggplot(data=df, mapping = aes(x=y)) + 
  geom_histogram(col=6, fill='#00FFFF', alpha=0.3) + 
  geom_rug(col=2, alpha=0.5)


4.3 Boxplot

Ainda com foco nas análises univariadas, uma alternativa ao gráfico de densidade e ao histograma é o boxplot:

ggplot(data=df, mapping = aes(y=y)) + 
  geom_boxplot(col=3, fill=3, alpha=0.4)


4.4 Gráficos de dispersão

Para duas variáveis numéricas o gráfico de maior importância é o de dispersão, que pode ser gerado utilizando o geom_point():

ggplot(data=df, mapping = aes(x=x,y=y)) + 
  geom_point()

Pode-se ainda gerar um gráfico utilizando todas as variáveis do nosso data frame, com uma variável numérica no eixo x, outra no eixo y e com diferentes cores representando a variável categórica, tais atributos são definidos dentro do aes(). Há a possibilidade de adicionar linhas de tendência ao gráfico com o uso do geom_smooth():

ggplot(data=df, mapping = aes(x=x,y=y,col=z)) +
  geom_point(alpha=0.8) + 
  geom_smooth(method = 'lm', col=1) + 
  geom_rug(alpha=0.1)


4.5 Boxplot para níveis de um fator

Para verificar o comportamento de uma variável categórica nos valores observados de uma variável numérica o boxplot se mostra uma boa alternativa, a diferença do caso já mencionado é que aqui temos uma variável x (fator) e uma variável y (numérica):

ggplot(data=df, mapping = aes(x=z,y=y,col=z)) + 
  geom_boxplot()

E algumas customizações:

ggplot(data=df, mapping = aes(x=z,y=y,col=z)) +
  geom_boxplot(col=c(3,4), fill=c(3,4), alpha=0.3)


4.6 Eixos e título

A atribuição de eixos e títulos faz-se com uso do ggtitle(), xlab() e ylab():

ggplot(data=df, mapping = aes(x=x,y=y))+
  geom_point(alpha=0.5)+
  ggtitle('Título')+
  xlab('Eixo x')+
  ylab('Eixo y')


4.7 Facet

O facet_wrap() permite gerar gráficoa em que faz-se a distinção entre os níveis de um fator:

ggplot(data=df, mapping = aes(x=x,y=y,col=z)) + 
  geom_point(alpha=0.5)+
  geom_smooth(se=F, lwd=1.5, col=1) + 
  facet_wrap(~z)


5 Outros tipos de gráfico

Além dos gráficos já mencionados, alguns outros são comumentes usados em análises exploratória:

5.1 Gráfico de barras

O gráfico de barras é utilizado quado tem-se interesse em observar frequências, no ggplot pode ser gerado da seguinte forma:

dados <- data.frame(fator = factor(c("a","b","c","d","e"), 
                                        levels=c("a","b","c","d","e")), 
                          contagem = c(125, 170, 124, 128, 163))

ggplot(data=dados, aes(x=fator, y=contagem)) + 
  geom_bar(stat="identity", 
         fill=5, 
         col=4, 
         alpha=0.2,
            lwd=1)+
  geom_text(aes(label=contagem), 
            vjust=1.6, 
            color=1, 
            size=3.5)+
  ylab("") +
  xlab("")

5.2 Gráfico de setores

Outra alternativa para visualização de frequências é o gráfico de setores:

dados <- data.frame(fator = factor(c("a","b","c","d","e","f"), 
                                        levels=c("a","b","c","d","e", "f")), 
                          contagem = c(125, 170, 124, 128, 163, 500))

ggplot(dados, aes(x="", y=contagem, fill=fator))+
  geom_bar(width = 1, stat = "identity", col='white', alpha=0.5)+ 
  coord_polar("y", start=0)

5.3 Violino

Para confecção deste gráfico utiliza-se o geom_violin(), o gráfico consiste no espelhamento do gráfico de densidade da variável; pode ser utilizado para explorar uma variável numérica ou para verificar o efeito de níveis de um fator sobre uma variável numérica:

dados <- data.frame(x = rep(c('a','b','c','d'),50),
                    y = rgamma(200, 12,3))

ggplot(data=dados, mapping = aes(x=x,
                                 y=y,
                                 fill=x,
                                 col=x))+
  geom_violin(alpha=0.5, lwd=2)+
  theme(legend.position = 'none')


5.4 Gráficos em painel

O clássico par(mfrow = c()) não é aplicável a gráficos ggplot2. Porém é possível gerar gráficos em painel através da função grid.arrange do pacote gridExtra:

library(gridExtra)
library(gridExtra)
g1 <- ggplot(data=df, mapping = aes(x=y))+
  geom_density(col=2, fill=2, alpha=0.3)

g2 <- ggplot(data=df, mapping = aes(x=y))+
  geom_histogram(col=6, fill=6, alpha=0.3)

g3 <- ggplot(data=df, mapping = aes(x=x,y=y,col=z))+
  geom_point(alpha=0.5)+
  geom_smooth(col=1)

g4 <- ggplot(data=df, mapping = aes(x=z,y=y,col=z)) +
  geom_boxplot(col=c(3,4),
               fill=c(3,4),
               alpha=0.3)
grid.arrange(g1,g2,g3,g4,nrow=2,ncol=2)


6 Temas

O pacote tem uma variedade de temas:

library(ggplot2)
temas <- ls("package:ggplot2")
ind <- grep('theme_', temas)
temas[ind[]]
##  [1] "theme_bw"       "theme_classic"  "theme_dark"     "theme_get"     
##  [5] "theme_gray"     "theme_grey"     "theme_light"    "theme_linedraw"
##  [9] "theme_minimal"  "theme_replace"  "theme_set"      "theme_test"    
## [13] "theme_update"   "theme_void"

Para utlizálos, basta acrescentar + theme_(nome do tema). Alguns são extremamente parecidos. Confira os principais:

tema <- data.frame(x=1,y=1)

graf <- ggplot(data=tema, mapping = aes(x=x,y=y))

a <- graf+theme_bw()+ggtitle('bw')+xlab('')+ylab('')
b <- graf+theme_classic()+ggtitle('classic')+xlab('')+ylab('')
c <- graf+theme_dark()+ggtitle('dark')+xlab('')+ylab('')
d <- graf+theme_gray()+ggtitle('gray')+xlab('')+ylab('')
e <- graf+theme_light()+ggtitle('light')+xlab('')+ylab('')
f <- graf+theme_minimal()+ggtitle('minimal')+xlab('')+ylab('')
g <- graf+theme_test()+ggtitle('test')+xlab('')+ylab('')
h <- graf+theme_void()+ggtitle('void')+xlab('')+ylab('')

grid.arrange(a,b,c,d,e,f,g,h, nrow=3,ncol=3)


7 Gráficos interativos

Com o pacote plotly é possível converter gráficos gerados com ggplot2 em gráficos interativos com o uso da função ggplotly:

install.packages('plotly')

7.1 Exemplo 1

ind <- sample(nrow(diamonds),4500,replace = F)

graf <- 
  ggplot(data=diamonds[ind,], aes(x=price,y=carat,col=clarity)) +
  geom_point(alpha=0.5) + 
  geom_rug(alpha=0.1, col='#F781F3')+
  geom_smooth(method='lm',se=F, col=1)+
  geom_smooth(method='loess',se=F, 
              col='#FF0040',
              linetype = 'longdash')

library(plotly)

ggplotly(graf)

7.2 Exemplo 2

graf2 <- 
  ggplot(data=diamonds[ind,], aes(x=table,y=depth,col=cut))+
  geom_point(alpha=0.3)+
  geom_smooth(method='lm',se=F, col=1)+
  facet_wrap(~clarity)+
  theme_light()+
  theme(legend.position = 'none')

ggplotly(graf2)

8 Considerações finais

O intuito deste material foi explorar a confecção e customização de gráficos fazendo uso do ggplot2. O aprendizado e a própria customização dos gráficos pode ser de certa forma trabalhosa devido às diferenças de sintaxe dos gráficos produzidos no R e às inúmeras possíveis combinações de geoms e parâmetros que controlam a estética dos gráficos. Contudo, o pacote permite a geração de gráficos que, no geral, são mais atrativos visualmente que aqueles gerados utilizando o R base e que, com uso do plotly, são facilmente convertidos para gráficos interativos.